/**
 * ECMAScript提供了两组操作符，第一组是等于（==）和不等于（!=）,第二组是全等(===)和不全等(!==)
 */

/**
 * 1. 等于和不等于：这两个操作数会先进行类型的转换，在确定操作数是否相等
 * 遵循如下规则：
 */

//①如果任一操作数是布尔值，则将其转换为数值再比较是否相等。false转换为 0，true转换为1
// console.log(true == 1) //true 'true'=>1
// console.log(false == 0) //true
// console.log(true == 2) //false

//②如果一个操作数是字符串，另一个操作数是数值，则尝试将字符串转换为数值，再比较是否相等
// console.log('1' == 1) //true  '1'=>1
// console.log('ab' == 1) //false  'ab'=>NaN

//③如果一个操作数是对象，另一个操作数不是，则调用对象的valueOf()方法取得其原始值，再根据前面的规则进行比较
let obj = {
  name: 'li',
  valueOf() {
    return 1
  },
}
console.log('对象a', obj == 1)

//④null 和 undefined 相等
console.log(null == undefined) //true

//⑤null 和 undefined 不能转换为其他类型的值再进行比较

//⑥如果有任一操作数是NaN，则相等操作符返回 false，不相等操作符返回 true
//记住:即使两个操作数都是 NaN，相等操作符也返回 false，因为按照规则，NaN 不等于 NaN
console.log(NaN == NaN) //false
console.log(NaN != NaN) //true

//⑦如果两个操作数都是对象，则比较它们是不是同一个对象。如果两个操作数都指向同一个对象
//则相等操作符返回 true。否则，两者不相等

/**
 * 2. 全等和不全等：这两个操作数不会进行转换
 * 如要相等，必须完全一样，类型和值都一样
 */

console.log('1' !== 1) //true

/**
 * 结论： 推荐使用全等和不全等操作符，因为相等和不相等存在类型转换问题
 */
